package com.feiwo.nonego.rpc.serialization.jdk;

import com.feiwo.nonego.rpc.serialization.api.Serialization;
import com.feiwo.nonego.rpc.serialization.api.exception.SerializerException;
import com.feiwo.nonego.rpc.spi.annotation.SPIClass;

import java.io.*;
import java.util.Objects;

/**
 * JDK 序列化实现
 *
 * @author feiwo 2025-08-05
 */
@SPIClass
public class JdkSerialization implements Serialization {

    /**
     * 序列化对象为字节数组
     *
     * @param <T> 泛型类型参数，表示要序列化的对象类型
     * @param obj 要序列化的对象，不能为null
     * @return 序列化后的字节数组
     * @throws SerializerException 当序列化对象为null或序列化过程中发生IO异常时抛出
     */
    @Override
    public <T> byte[] serialize(T obj) {
        if (Objects.isNull(obj)) {
            throw new SerializerException("serialization object is null");
        }
        // 使用字节输出流和对象输出流将对象序列化为字节数组
        try (var os = new ByteArrayOutputStream(); var out = new ObjectOutputStream(os)){
            out.writeObject(obj);
            return os.toByteArray();
        } catch (IOException e) {
            throw new SerializerException(e.getMessage(),e);
        }
    }


    /**
     * 反序列化字节数组为指定类型的对象
     *
     * @param data 待反序列化的字节数组数据
     * @param clazz 目标对象的类型Class
     * @param <T> 泛型类型参数
     * @return 反序列化后的对象实例
     * @throws SerializerException 当数据为null或反序列化过程中发生异常时抛出
     */
    @Override
    public <T> T deserialize(byte[] data, Class<T> clazz) {
        if (Objects.isNull(data)) {
            throw new SerializerException("deserialization data is null");
        }
        // 使用ByteArrayInputStream和ObjectInputStream进行反序列化操作
        try (var is = new ByteArrayInputStream(data); var ois = new ObjectInputStream(is)){
            //noinspection unchecked
            return (T) ois.readObject();
        } catch (IOException | ClassNotFoundException e) {
            throw new SerializerException(e.getMessage(),e);
        }
    }

}
